package co.edu.eam.persitencia.entidades;

import co.edu.eam.persitencia.enumeraciones.EstadoConsultaEnum;
import co.edu.eam.persitencia.enumeraciones.MotivoConsultaEnum;
import co.edu.eam.persitencia.enumeraciones.TipoProcedimietoEnum;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;

/**
 * Entity implementation class for Entity: Consulta
 *
 */
@NamedQueries({
  @NamedQuery(name=Consulta.CONSULTA_LISTAR_CONSULTA_FECHA,query=("SELECT consulta FROM Consulta consulta WHERE consulta.fechaHora=:"+Consulta.PARAMETRO_FECHA_CONSULTA)),
  @NamedQuery(name=Consulta.CONSULTA_LISTAR_CONSULTA_PACIENTE,query=("SELECT consulta FROM Consulta consulta WHERE consulta.paciente.documento=:"+Consulta.PARAMETRO_PACIENTE_CONSULTA)),
  @NamedQuery(name=Consulta.CONSULTA_LISTAR_PROCEDIMIENTO,query=("SELECT consulta FROM Consulta consulta WHERE consulta.procedimiento=:"+Consulta.PARAMETRO_ID_PROCEDIMIENTO)),
})
@Entity
@Table(name = "Clinica_Consulta")
public class Consulta implements Serializable {
    
    public static final String CONSULTA_LISTAR_CONSULTA_FECHA="Consulta.ListarConsulta_fecha";
    public static final String PARAMETRO_FECHA_CONSULTA="fechaHora";
    
    public static final String CONSULTA_LISTAR_PROCEDIMIENTO="Consulta.ListarConsulta_Procedimiento";
    public static final String PARAMETRO_ID_PROCEDIMIENTO="id";
    
    public static final String CONSULTA_LISTAR_CONSULTA_PACIENTE="Consulta.ListarConsulta_paciente";
    public static final String PARAMETRO_PACIENTE_CONSULTA="documento";

 
    
    
    /**
     * Identificador unico de la entidad.
     */
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "Consulta_Id")
    private long id;
    /**
     * fecha y hora de la consulta.
     */
    @Temporal(javax.persistence.TemporalType.DATE)
    @Column(name = "Consulta_Fecha")
    private Date fechaHora;
    /**
     * paciente que expide la consulta.
     */
    @ManyToOne
    @JoinColumn(name = "Consulta_paciente")
    private Paciente paciente;
    /**
     * Medico que atendera la cita.
     */
    @ManyToOne
    @JoinColumn(name = "Consulta_Medico")
    private Medico medico;
    /**
     * Motivo de la consulta.
     */
    @Column(name="Consulta_Motivo")
    @Enumerated(EnumType.STRING)
    private MotivoConsultaEnum motivo;
    /**
     * Procedimiento que se llevara a cabo en la consulta.
     */
    @Column(name="Consulta_Procedimiento")
    @Enumerated(EnumType.STRING)
    private TipoProcedimietoEnum procedimiento;
    /**
     *
     */
    @Column(name = "Consulta_Unidad")
    private boolean unidad;
    /**
     * Remision de la consulta.
     */
    @OneToOne(mappedBy = "consulta",cascade= CascadeType.ALL)
    private Remision remisiones;
    /**
     * Orden medica que tiene la consulta.
     */
    @ManyToOne
    @JoinColumn(name="Consulta_OrdenMedica")
    private OrdenMedica ordenMedica;
    /**
     * Formula medica que tiene la consulta.
     */
    @ManyToOne
    @JoinColumn(name = "Consulta_FormulaMedica")
    private FormulaMedica formulaMedica;
    /**
     * detalleHistoria que se escribe en esta cita.
     */
    @OneToOne(mappedBy="consulta",cascade= CascadeType.ALL)
    private DetalleHistoriaClinica detalleHistoriaClinica;
    /**
     * estado de la consulta.
     */
    @Column(name="Consulta_Estado")
    @Enumerated(EnumType.STRING)
    private EstadoConsultaEnum estado;

    /**
     * constructor vacio
     */
    public Consulta() {
        super();
    }
/**
 * contructor con los parametros de a cponsulta
 * @param fechaHora de la consulta
 * @param paciente de la consulta
 * @param medico de la consulta
 * @param motivo  de la consulta
 */
    public Consulta(Date fechaHora, Paciente paciente, Medico medico, MotivoConsultaEnum motivo) {
        this.fechaHora = fechaHora;
        this.paciente = paciente;
        this.medico = medico;
        this.motivo = motivo;
    }
    

    /**
     * @param id  de la consulta
     * @param fechaHora de la consulta
     * @param paciente de la consulta
     * @param medico de la consulta
     * @param motivo de la consulta 
     * @param procedimiento de la consulta
     */
    public Consulta(Date fechaHora, Paciente paciente, Medico medico,
            MotivoConsultaEnum motivo, TipoProcedimietoEnum procedimiento) {
        super();
        this.fechaHora = fechaHora;
        this.paciente = paciente;
        this.medico = medico;
        this.motivo = motivo;
        this.procedimiento = procedimiento;
    }

    public Remision getRemisiones() {
        return remisiones;
    }

    public void setRemisiones(Remision remisiones) {
        this.remisiones = remisiones;
    }

    public FormulaMedica getFormulaMedica() {
        return formulaMedica;
    }

    public void setFormulaMedica(FormulaMedica formulaMedica) {
        this.formulaMedica = formulaMedica;
    }
    /**
     * @return the unidad
     */
    public boolean isUnidad() {
        return unidad;
    }
    /**
     * @param unidad the unidad to set
     */
    public void setUnidad(boolean unidad) {
        this.unidad = unidad;
    }
    /**
     * @return the id
     */
    public long getId() {
        return id;
    }
    /**
     * @param id the id to set
     */
    public void setId(long id) {
        this.id = id;
    }
    /**
     * @return the fechaHora
     */
    public Date getFechaHora() {
        return fechaHora;
    }

    /**
     * @param fechaHora the fechaHora to set
     */
    public void setFechaHora(Date fechaHora) {
        this.fechaHora = fechaHora;
    }

    /**
     * @return the paciente
     */
    public Paciente getPaciente() {
        return paciente;
    }

    /**
     * @param paciente the paciente to set
     */
    public void setPaciente(Paciente paciente) {
        this.paciente = paciente;
    }

    /**
     * @return the medico
     */
    public Medico getMedico() {
        return medico;
    }

    /**
     * @param medico the medico to set
     */
    public void setMedico(Medico medico) {
        this.medico = medico;
    }

    /**
     * @return the motivo
     */
    public MotivoConsultaEnum getMotivo() {
        return motivo;
    }

    /**
     * @param motivo the motivo to set
     */
    public void setMotivo(MotivoConsultaEnum motivo) {
        this.motivo = motivo;
    }

    /**
     * @return the procedimiento
     */
    public TipoProcedimietoEnum getProcedimiento() {
        return procedimiento;
    }

    /**
     * @param procedimiento the procedimiento to set
     */
    public void setProcedimiento(TipoProcedimietoEnum procedimiento) {
        this.procedimiento = procedimiento;
    }

    /**
     * @return the ordenMedica
     */
    public OrdenMedica getOrdenMedica() {
        return ordenMedica;
    }

    /**
     * @param ordenMedica the ordenMedica to set
     */
    public void setOrdenMedica(OrdenMedica ordenMedica) {
        this.ordenMedica = ordenMedica;
    }

    /**
     * @return the formulanMedica
     */
    public FormulaMedica getFormulanMedica() {
        return formulaMedica;
    }

    /**
     * @param formulanMedica the formulanMedica to set
     */
    public void setFormulanMedica(FormulaMedica formulanMedica) {
        this.formulaMedica = formulanMedica;
    }

    /**
     * @return the detalleHistoriaClinica
     */
    public DetalleHistoriaClinica getDetalleHistoriaClinica() {
        return detalleHistoriaClinica;
    }

    /**
     * @param detalleHistoriaClinica the detalleHistoriaClinica to set
     */
    public void setDetalleHistoriaClinica(DetalleHistoriaClinica detalleHistoriaClinica) {
        this.detalleHistoriaClinica = detalleHistoriaClinica;
    }

    //TODO:falta toString
    public EstadoConsultaEnum getEstado() {
        return estado;
    }

    public void setEstado(EstadoConsultaEnum estado) {
        this.estado = estado;
    }
}
